# 功能需求约束
# 1.	数据集选择：
# 必须使用乳腺癌数据集进行模型的训练和测试。
import matplotlib.pyplot as plt
import torch
from sklearn.datasets import load_breast_cancer
# 数据集应包含患者的特征和对应的标签（恶性或良性）。
data,target = load_breast_cancer(return_X_y=True)
target = target.reshape(-1,1)
# 2.	数据预处理：
# 数据必须进行标准化处理，以确保模型训练的稳定性和效率。
from sklearn.preprocessing import StandardScaler
data = StandardScaler().fit_transform(data)
# 标准化后的数据应转换为PyTorch张量，以便后续使用PyTorch进行模型训练。
x = torch.tensor(data,dtype=torch.float)
y = torch.tensor(target,dtype=torch.float)
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x,y,test_size=0.2)
print(x_train.shape)
# 3.	模型定义：
# 定义一个简单的神经网络模型，用于对预处理后的乳腺癌数据集进行分类。
# 模型应包含一个线性层和一个Sigmoid激活函数，以适应二分类任务的需求。
# 输入特征数量应与乳腺癌数据集的特征数量相匹配。
model = torch.nn.Sequential(
    torch.nn.Linear(in_features=30,out_features=1),
    torch.nn.Sigmoid()
)
# 4.	损失函数和优化器：
# 使用二进制交叉熵损失函数（BCELoss）作为模型的损失函数。
# 选择RMSprop优化器来优化模型的参数。
loss_fn = torch.nn.BCELoss()
optimizer = torch.optim.RMSprop(model.parameters(),lr=0.001)
# 5.	模型训练：
# 通过迭代训练数据来训练模型，并定期输出损失值以监控训练过程。
# 迭代次数可能需要调整以达到最佳的训练效果。
model.train()
loss_list = []
for epoch in range(2000):
    optimizer.zero_grad()
    train_pred = model(x_train)
    loss = loss_fn(train_pred,y_train)
    loss_list.append(loss)
    loss.backward()
    optimizer.step()
    if epoch % 10 == 0:
        print(f'epoch:{epoch},loss:{loss.item():.4f}')
# 6.	模型测试：
# 使用测试集数据对训练好的模型进行评估。
# 通过比较模型的预测结果和真实标签来计算分类的准确率。
# 输出模型的准确率作为性能评估的指标。
model.eval()
with torch.no_grad():
    test_pred = model(x_test)
    test_pred = (test_pred>0.5).int()
    acc = (test_pred==y_test).float().mean()
    print(acc)
    plt.plot(loss_list)
    plt.xlabel('epoch')
    plt.ylabel('loss')
    plt.show()
# 7.	性能评估：
# 准确率是评估模型性能的主要指标。
# 可以通过调整模型结构、损失函数、优化器等来提高模型的准确率。
# 8.	代码实现：
# 代码应具有良好的可读性和可维护性。
# 应使用适当的注释来解释代码的功能和逻辑。
# 应遵循Python和PyTorch的编程规范和最佳实践。
# 9.	结果输出：
# 在训练过程中，应定期输出损失值以监控训练进度。
# 在模型测试后，应输出模型的准确率作为性能评估的结果。
# 可以在代码中添加适当的打印语句或使用matplotlib等库来可视化结果。
# 10.	环境依赖：
# 项目应明确列出所需的环境依赖，包括Python版本、PyTorch版本、sklearn版本等。
# 应确保代码在指定的环境下能够正常运行并达到预期的效果
